package com.driver.enums;

import com.fasterxml.jackson.annotation.JsonValue;

/**
 * @Description 全局返回给前端的对象中code的枚举类
 */
public enum ResponseCode {

    // 成功状态码
    SUCCESS(0, "成功"),

    // 失败状态码
    FAIL(-1, "失败"),

    // 信息提示状态码
    INFO_SUCCESS(100, "操作成功"),

    // 警告状态码
    WARN_201(201, "参数错误"),
    WARN_202(202, "权限不足"),

    // 错误状态码
    // 30开头是基础错误状态码
    ERROR_SYSTEN(300, "系统错误"),
    ERROR_DATABASE(301, "数据库错误"),
    ERROR_NETWORK(302, "网络错误"),
    ERROR_REFUSED(303, "请求被拒绝"),
    ERROR_DATABASE_KEY_DUPLICATE(304, "主键冲突或违反唯一索引约束"),
    ERROR_RESOURCE_NOT_FOUND(306, "资源未找到"),
    ERROR_PARAM_MISSING(307, "缺少参数"),
    ERROR_PARAM_ERROR(308, "参数错误"),
    ERROR_TIMEOUT(309, "请求超时"),
    // 31开头为权限认证的错误状态码
    ERROR_AUTHENTICATION(310, "认证失败"),
    ERROR_USER_LOCKED(311, "账户被锁定"),
    ERROR_USER_FORBIDDEN(312, "账户被禁用"),
    ERROR_USER_NOT_FOUND(313, "用户名未找到"),
    ERROR_USER_PASSWORD(315, "账号或密码错误"),
    ERROR_PERMISSION_DENIED(316, "权限不足，禁止访问"),

    // 32以上开头为业务错误状态码
    ERROR_PASSWORD_FORMAT(320, "用户密码6-16个字符，只能由数字，字母和~!@#$%^&*()_+`-组成"),
    ERROR_SUPER_ADMIN_FORMAT(321, "禁止创建或修改超级管理员信息"),
    ERROR_ADMIN_FORMAT(322, "禁止非超级管理员创建或修改管理员信息"),
    ERROR_FILE_UPLOAD(323, "文件上传错误"),
    ERROR_FILE_UPLOAD_FORBIDDEN(324, "文件类型禁止上传"),
    ERROR_FILE_UPLOAD_SIZE(325, "文件大小超过限制"),
    ERROR_EMAIL_FORMAT(326, "邮箱格式错误"),

    // 其他状态码
    OTHER_400(400, "未知错误"),
    OTHER_451(451, "不可用，因为法律原因"),

    // 服务器错误
    SERVER_ERROR_500(500, "服务器内部错误"),
    SERVER_ERROR_502(502, "错误网关"),
    SERVER_ERROR_504(504, "网关超时"),
    SERVER_ERROR_505(505, "HTTP 版本不受支持"),
    SERVER_ERROR_507(507, "服务器磁盘空间不足"),
    SERVER_ERROR_510(510, "不支持的网络认证"),
    SERVER_ERROR_511(511, "需要网络认证"),
    ;

    /**
     * 返回码
     */
    @JsonValue
    private final int code;

    /**
     * 返回消息
     */
    private final String message;

    ResponseCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
